#ifndef _GTX31X_APP_H_
#define _GTX31X_APP_H_

#include "gtx31x_board.h"

// 键盘禁用时间          - 1s
#define GTX31X_KEYBOARD_DISABLE_TIMEOUT                    (1000ul)
// 键盘唤醒延时时间      - 100ms
#define GTX31X_KEYBOARD_WAKEUP_DELAY_TIME                  (100ul)

// 查询状态位间隔时间    - 500ms
#define GTX31X_QUERY_STATUS_BIT_INTERVAL                   (500ul)
// 获取键值等待时间     - 20ms
#define GTX31X_GET_KEY_VALUE_WAIT_TIME                     (20ul)

// 键入键值长度
#define GTX31X_NUMBER_OF_MAX_KEYSCANF                      (TYPE_THE_LENGTH_OF_KEY)

/**
 * @brief 按键输入结果
 *
 */
typedef enum
{
  GTX31X_KEY_ENTERED,              // 密钥输入成功
  GTX31X_INVALID_KEY_ENTRY,        // 无效键值
  GTX31X_KEY_ENTRY_FAILURE,        // 密钥输入失败
  GTX31X_EXIT_CURRENT_MODE,        // 退出当前模式
  GTX31X_WAIT_FOR_USER_ENTER_KEY,  // 等待用户下一次键入
  GTX31X_WAIT_FOR_PLAYBACK_FINISH, // 等待音效播完完毕
} Gtx31xKeyScanfResult_t;

/**
 * @brief 获取键值步骤
 *
 */
typedef enum
{
  GTX31X_DEVICE_IDLE,               // 空闲
  GTX31X_GET_KEY_VALUE,             // 获取键值
  GTX31X_KEY_IN_TIMEOUT,            // 输入超时
  GTX31X_GET_VOICE_PLAYBACK_STATUS, // 获取语音播放状态
} Gtx31xStep_t;

/**
 * @brief 键入模式
 *
 */
typedef enum
{
  GTX31X_NORMAL,               // 正常模式
  GTX31X_LOCAL_REGISTER,       // 本地注册
  GTX31X_LOCAL_REGISTER_EXIT,  // 本地注册监听
  GTX31X_KEYIN_ADMIN_PASSWORD, // 验证管理员密码
} Gtx31xKeyscanfMode_t;

/**
 * @brief 用户键入键值
 *
 */
typedef struct
{
  uint8_t NumberOfKey;                          // 键入键值个数
  char KeyValue[GTX31X_NUMBER_OF_MAX_KEYSCANF]; // 键入键值

  /**
   * @brief 待验证信息
   *
   */
  struct KeyToBeValidated
  {
    bool WaitForVerification;                        // 待验证标识
    char KeyedValue[USER_AUTHENTICATION_KEY_LENGTH]; // 待验证数值
  } KeyedInformation;
} Gtx31xUserTypedKeys_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  uint8_t WakeupEn  : 1;               // 唤醒标志
  uint8_t StandbyEn : 1;               // 待机标志
  uint8_t Reserved  : 6;               // 保留位

  char KeyValue;                       // 键值
  Gtx31xStep_t OperationStep;          // 操作步骤
  Gtx31xKeyscanfMode_t KeyscanfMode;   // 键入模式
  Gtx31xUserTypedKeys_t UserTypedKeys; // 用户键入键值
} Gtx31xStatusBit_t;

typedef Gtx31xKeyScanfResult_t (*Gtx31xKeyScanfFunction_t)(void);

/**
 * @brief 加载默认配置
 *
 */
extern void Gtx31xLoadDefaultConfiguration(void);

/**
 * @brief 进入睡眠模式
 *
 */
extern void Gtx31xIntoSleepMode(void);

/**
 * @brief 进入待机模式
 *
 */
extern void Gtx31xIntoStandbyMode(void);

/**
 * @brief 启动设备自检任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool Gtx31xStartDeviceSelfTestTask(void);

/**
 * @brief 启动本地注册任务
 *
 * @return bool - 启动状态（true：成功 false：失败）
 */
extern bool Gtx31xStartLocalRegisterTask(void);

/**
 * @brief 本地注册退出监听使能
 *
 */
extern void Gtx31xLocalRegisterExitListerConfig(void);

/**
 * @brief 启动用户密码验证任务
 *
 */
extern void Gtx31xVerifyUserPermissionTask(void);

/**
 * @brief 启动键入管理员密码
 *
 */
extern void Gtx31xStartKeyInAdminPassword(void);

/**
 * @brief 使能键盘
 *
 */
extern void Gtx31xEnableKeyboardFunction(void);

/**
 * @brief 禁用键盘功能
 *
 * @param DisableTime - 禁用时间
 */
extern void Gtx31xDiableKeyboardFunction(uint32_t DisableTime);

/**
 * @brief 初始化相关功能
 *
 */
extern void Gtx31xConfiguration(void);

#endif
